Using Interfaces as Services in ASP.NET Core
ASP.NET Core में इंटरफेस का उपयोग
ASP.NET Core के अंतर्गत क्लास के अलावा क्या इंटरफेस भी सर्विसेज के रूप में प्रयोग किया जा सकता है? दोस्तों! 🙏 आइए, इस प्रश्न का उत्तर समझते हैं।
हाँ, ASP.NET Core में इंटरफेस को भी सर्विस के रूप में प्रयोग किया जा सकता है। लेकिन कुछ महत्वपूर्ण बातें ध्यान रखने योग्य हैं:
1. इंटरफेस को सर्विस के रूप में उपयोग करने के लिए उसे एक इम्प्लिमेंटेशन क्लास की जरूरत होती है
ASP.NET Core का Dependency Injection (DI) कंटेनर डायरेक्ट इंटरफेस को सर्विस के रूप में रजिस्टर नहीं कर सकता जब तक कि उसकी कोई इम्प्लिमेंटेशन न हो।
✅ सही तरीका (इंटरफेस + इम्प्लिमेंटेशन क्लास)
public interface IMyService
{
string GetMessage();
}
public class MyService : IMyService
{
public string GetMessage() => "Hello from MyService!";
}
📌 यहाँ DI कंटेनर को पता है कि IMyService का उपयोग करने पर MyService को inject करना है।
2. केवल क्लास को ही सर्विस के रूप में रजिस्टर किया जा सकता है
यदि आप सिर्फ इंटरफेस को DI कंटेनर में रजिस्टर करने की कोशिश करेंगे, तो यह संभव नहीं होगा क्योंकि इंटरफेस का कोई कॉन्क्रीट इम्प्लिमेंटेशन नहीं होता।
❌ गलत तरीका (सिर्फ इंटरफेस)
// यह काम नहीं करेगा
builder.Services.AddScoped<IMyService>();
⛔ यह कोड InvalidOperationException देगा क्योंकि DI कंटेनर को नहीं पता कि IMyService को किस क्लास से इम्प्लिमेंट किया जाए।
3. यदि किसी इंटरफेस को ही DI में रजिस्टर करना हो तो एक डिफ़ॉल्ट इम्प्लिमेंटेशन दें
यदि आप चाहते हैं कि कोई डायनामिक लॉजिक या डिफॉल्ट इम्प्लिमेंटेशन हो, तो आप इसे AddSingleton के साथ फैक्टरी मेथड में बना सकते हैं।
✅ डायनामिक इंटरफेस रजिस्ट्रेशन (Lambda Expression के साथ)
builder.Services.AddSingleton<IMyService>(provider =>
{
return new MyService(); // मैन्युअली इम्प्लिमेंटेशन देना होगा
});
4. कुछ स्पेशल केस में केवल इंटरफेस को रजिस्टर किया जा सकता है
यदि कोई मार्कर इंटरफेस (Marker Interface) हो, जिसका कोई डायरेक्ट इम्प्लिमेंटेशन न हो, लेकिन वह Open Generic Type के साथ इस्तेमाल हो, तो इसे AddTransient किया जा सकता है।
✅ स्पेशल केस: Open Generic Types
public interface IRepository<T>
{
void Add(T item);
}
public class Repository<T> : IRepository<T>
{
public void Add(T item) { /* ... */ }
}
// Open Generic Type रजिस्टर करना
builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
📌 अब IRepository<Product> या IRepository<Order> को Inject किया जा सकता है।
Next: ASP.NET Core के अंतर्गत क्लास के property को क्या सर्विसेज के रूप में प्रयोग किया जा सकता है?
टिप्पणियाँ
एक टिप्पणी भेजें